//package com.huarui.user.service;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Map.Entry;
//
//import org.ewaf.framework.cache.DefaultCacheStatusChecker;
//import org.ewaf.framework.cache.ICacheStatusChecker;
//import org.ewaf.framework.cache.ICacheStatusProvider;
//import org.ewaf.framework.cache.ICacheSupport;
//import org.ewaf.framework.model.AccessControl;
//import org.ewaf.framework.service.BaseService;
//import org.ewaf.framework.util.ParamUtil;
//
//import com.huarui.user.dao.IAccessControlDao;
//import com.huarui.user.model.Token;
//
//
//public class AccessControlService extends BaseService implements ICacheSupport {
//	
//	private static class ParamFilter {
//		
//		private final Map<String, String> params;
//		private final int visitors;
//		
//		public ParamFilter(Map<String, String> params, int visitors) {
//			this.params = params;
//			this.visitors = visitors;
//		}
//
//		public Map<String, String> getParams() {
//			return params;
//		}
//
//		public int getVisitors() {
//			return visitors;
//		}
//		
//	}
//	
//	private static class PathNode {
//		
//		private final Map<String, PathNode> childNodes;
//		private final List<ParamFilter> paramFilters;
//		private boolean underControl;
//		private int visitors;
//		
//		public PathNode(Map<String, PathNode> childNodes, List<ParamFilter> paramFilters) {
//			this.childNodes = childNodes;
//			this.paramFilters = paramFilters;
//		}
//
//		public Map<String, PathNode> getChildNodes() {
//			return childNodes;
//		}
//
//		public List<ParamFilter> getParamFilters() {
//			return paramFilters;
//		}
//		
//		public boolean isUnderControl() {
//			return underControl;
//		}
//
//		public void setUnderControl(boolean underControl) {
//			this.underControl = underControl;
//		}
//
//		public int getVisitors() {
//			return visitors;
//		}
//
//		public void setVisitors(int visitors) {
//			this.visitors = visitors;
//		}
//		
//	}
//	
//	private static class UrlInfo {
//		
//		private final String[] path;
//		private final Map<String, String> params;
//		
//		public UrlInfo(String[] path, Map<String, String> params) {
//			this.path = path;
//			this.params = params;
//		}
//
//		public String[] getPath() {
//			return path;
//		}
//		
//		public Map<String, String> getParams() {
//			return params;
//		}
//		
//	}
//	
//	private ICacheStatusChecker cacheStatusChecker;
//	
//	public void setCacheStatusProvider(ICacheStatusProvider cacheStatusProvider) {
//		cacheStatusChecker = new DefaultCacheStatusChecker(
//				cacheStatusProvider, getClass().getName(), this);
//	}
//	
//	private IAccessControlDao getDao() {
//		return (IAccessControlDao) dao;
//	}
//	
//	private PathNode root;
//	
//	public synchronized void initCache() {
//		List list = getDao().query(null);
//		PathNode root = createPathNode();
//		
//		for (AccessControl ac : (List<AccessControl>) list) {
//			addNode(root, parseUrl(ac.getUrl()), ac.getVisitors());
//		}
//		
//		this.root = root;
//	}
//	
//	public boolean hasPermission(Token token, String url, Map<String, String> otherParams) {
//		cacheStatusChecker.checkCache();
//		
//		UrlInfo ui = parseUrl(url);
//		PathNode node = getNode(root, ui.getPath());
//		if (!node.isUnderControl()) {
//			return true;
//		}
//		
//		Map<String, String> params = ui.getParams();
//		if (otherParams != null) {
//			if (params != null) {
//				params.putAll(otherParams);
//			} else {
//				params = otherParams;
//			}
//		}
//		
//		int visitors = getVisitors(node, params);
//		return (token.getRoles() & visitors) != 0;
//	}
//	
//	private PathNode getNode(PathNode root, String[] path) {
//		PathNode node = root;
//		for (int i = 0, n = path.length; i < n; i++) {
//			String nodeName = path[i];
//			
//			Map<String, PathNode> childNodes = node.getChildNodes();
//			PathNode pn = childNodes.get(nodeName);
//			if (pn == null) {
//				break;
//			} else {
//				node = pn;
//			}
//		}
//		
//		return node;
//	}
//	
//	private int getVisitors(PathNode node, Map<String, String> params) {
//		boolean anyFilterMatched = false;
//		int visitors = 0;
//		
//		if (params != null && params.size() > 0) {
//			List<ParamFilter> paramFilters = node.getParamFilters();
//			for (ParamFilter filter : paramFilters) {
//				boolean matched = true;
//				Map<String, String> pm = filter.getParams();
//				for (Entry<String, String> e : pm.entrySet()) {
//					String value = params.get(e.getKey());
//					if (!e.getValue().equals(value)) {
//						matched = false;
//						break;
//					}
//				}
//				
//				if (matched) {
//					anyFilterMatched = true;
//					visitors |= filter.getVisitors();
//				}
//			}
//		}
//		
//		if (anyFilterMatched) {
//			return visitors;
//		} else {
//			return node.getVisitors();
//		}
//	}
//	
//	private void addNode(PathNode root, UrlInfo ui, int visitors) {
//		String[] path = ui.getPath();
//		Map<String, String> params = ui.getParams();
//			
//		PathNode node = root;
//		for (int i = 0, n = path.length; i < n; i++) {
//			String nodeName = path[i];
//			
//			Map<String, PathNode> childNodes = node.getChildNodes();
//			node = childNodes.get(nodeName);
//			if (node == null) {
//				node = createPathNode();
//				childNodes.put(nodeName, node);
//			}
//		}
//		
//		node.setUnderControl(true);
//		
//		if (params != null && params.size() > 0) {
//			List<ParamFilter> paramFilters = node.getParamFilters();
//			paramFilters.add(new ParamFilter(params, visitors));
//		} else {
//			node.setVisitors(visitors);
//		}
//	}
//	
//	private PathNode createPathNode() {
//		Map<String, PathNode> childNodes = new HashMap<String, PathNode>();
//		List<ParamFilter> paramFilters = new ArrayList<ParamFilter>();
//		return new PathNode(childNodes, paramFilters);
//	}
//	
//	private UrlInfo parseUrl(String url) {
//		String ps;
//		String qs;
//		int paramStart = url.indexOf('?');
//		if (paramStart > 0) {
//			ps = url.substring(0, paramStart);
//			qs = url.substring(paramStart + 1);
//		} else {
//			ps = url;
//			qs = null;
//		}
//		
//		String[] path = ps.split("[/!]");
//		if (path.length == 0) {
//			path = new String[] { "" };
//		} else {
//			for (int i = 0; i < path.length; i++) {
//				String nodeName = path[i];
//				int dot = nodeName.indexOf('.');
//				if (dot > 0) {
//					path[i] = nodeName.substring(0, dot);
//				}
//			}
//		}
//		
//		return new UrlInfo(path, ParamUtil.str2map(qs));
//	}
//
//}
